dimanche 3 janvier 2021

Arduino sur alimentation 12V externe : instabilité

 J'ai développé un. regulateur de pH pour ma piscine. Il est basé sur un arduino Mega. Bon, un ESP32 serait peut etre plus moderne...

Toput fonctionne tres bien lorsqu'il est alimenté par USB. Mais des que je l'alimente par une source 12V, le systeme devient instable : il fonctionne quelques minutes, puis stoppe. De plus le bouton reset ne reagit pas.

J'ai essayé plusieurs alimentations: résultat identique.

La solution: connecter le "-" de l'alim 12 a la terre (du secteur): ceci évite un potentiel volant qui semble gener le systeme. Maintenant l'arduino fonctionne depuis plusieurs jours sans probleme.


vendredi 8 novembre 2019

installation de home assistant sur raspberry pi et disque dur usb

Apres avoir teste jeedom, j'essaye home assistant.

Bon, je veux booter sur disque dur USB et pas SD card. malheureusement le systeme standard hass.io ne supporte pas encore cela. le disque dur USB boot bien , mais hass.io ne le reconnait pas.

Donc il est possible d'installer hass.io mais sur raspbian, et comme raspbian boote bien, c'est ce que je fais.

1. allons chercher le dernier raspbian en version light:
https://www.raspberrypi.org/downloads/raspbian/

2. "gravure" sur le disque dur USB, ici j'ai utilise belenaEtcher sur Windows; mais j'ai aussi utilise directement "dd" sur Mac.
a la fin de la procedure j'active ssh en creant un fichier "ssh" sur la partition boot visible. (dans le meme repertoire racine ou on peut trouver config.txt)

3. branchement du raspberry pi. booçt. comme j'ai deja assigne une adresse IP fixe dans le serveur DHCP, je connais l'adresse locale, sinon il faut trouver cette adresse dans le serveur DHCP (par exemple de la box)

4. connection par ssh.
A noter que l'on pourrait aussi se connecteur par clavier ecran, puis faire la configuration part ce biais; mais moi je prefere ssh.

5. mise en place d'un hostname specifique, car j'ai plusieurs RPI: prenons "domotique"
hostname domotique
hostname>/etc/hostname
sed -Eie "s/^(127.0.1.1[ \t]+).*/\1$(hostname)/" /etc/hosts

6. plus ou moins suivre la procedure: https://github.com/home-assistant/hassio-installer :
apt-get install docker-ce bash jq curl avahi-daemon dbus
bon, a vrai dire presque tout est deja la, sauf docker.
Je suis donc la procedure: https://www.docker.com/blog/happy-pi-day-docker-raspberry-pi/
curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh
bon, revenons a l'installation de hassio:
curl -sL https://raw.githubusercontent.com/home-assistant/hassio-installer/master/hassio_install.sh | bash -s -- -m raspberrypi3
A noter: il est important de passer le parametre "-m" avec la bonne valeur, une de celles proposees dans la page d'installation. Pour ma part  j'ai eu un probleme que j'ai decrit ici:
https://community.home-assistant.io/t/145697 car je n'avais pas donne une bonne valeur la premiere fois.
cela installe le service de demarrage du container:
systemctl status hassio-supervisor
On peut suivre l'installation avec:
journalctl -f -u  hassio-supervisor
Ca y est ca marche, on se connecte sur: http://domotique.local:8123


jeudi 26 septembre 2019

Installation du "trio" knxd/linknx/knxweb2 sur debian (ubuntu, raspbian, etc...)


J'avais publié il y a quelques années un article sur cette installation.
Mon systeme était au point et a correctement fonctionné de nombreuses années. Il a meme survécu a des upgrades OS (kubuntu) et php, jusqu'a cette année ou le vieux PC (année 2002?) a rendu l'ame. Bon c'etait deja le deuxième de marque Dell, de recupération. Ca vaut pas le coup de réparer, puisque j'en ai d'autres... de recuperation aussi, mais plus recent.
Le disque dur fonctionne encore, donc c'est possible de récupérer les données.
Par contre, l'ancien systeme etait 32 bit, donc c'était l'occasion de passer en 64 bit, ou bien d'installer sur un raspberry pi.
Bon, j'ai essaye le script: https://github.com/linknx/install
MMmmm je n'aime pas trop les installations à la hussarde, sans package.
J'ai donc rédigé un script: https://github.com/laurent-martin/trio-build
Celui-ci crée un package debian pour chaque composant nécéssaire:
  • libpthsem
  • linknx
  • knxd
  • knxweb2
Une fois les packages disponibles, il suffit de les installer de façon standard:
dpkg -i ...
Enfin, il reste a configurer le systeme.



mercredi 23 janvier 2019

Mini écran OLED économique sur raspberry pi pour affichage de statut

Projet

Ajouter un mini affichage pour avoir un statut sur le Raspberry Pi de la domotique intégré sur rail DIN dans le tableau électrique.

Solution

Un petit écran OLED de 3,3cm de diagonale visible (1'3) pour de moins de 10€ utilisant le circuit SH1106.

Références

https://luma-oled.readthedocs.io Le pilote pour écran OLED
https://python-pillow.org La librairie graphique générique

Péripéties

Me voila donc parti sur banggood ou je prend un écran 0.96' un peu au hasard pour 5€67
0_96-Inch-4Pin-Blue-Yellow-IIC-I2C-OLED-Display-Module
Quelques semaines passent, voila l'écran. bon, c'est du I2C: VCC GND SCL SDA
Une petite soudure pour mettre un connecteur, un câble de connections. Recherche sur internet, une page sur la librairie Adafruit et quelques instructions, installation de quelques paquets raspbian i2c, activation du i2c sur le RPI. (voir ici). Branchement, execution:

pi@rpi3:~ $ i2cdetect -y 1

Hum, nada, aucun appareil i2c détecté par Linux (que des "--").

Inspection , hum... l'écran est cassé sur le haut.justement la ou il y a la puce. .
Le premier écran, reçu cassé


Bon, l'écran n'a pas supporté le voyage... Il a du arriver à pied par la Chine...

Amazon cette fois ci : https://www.amazon.fr/gp/product/B078J78R45

Je pars pour un 1.3' , 9€ cette fois ci, mais livraison le lendemain. Réception rapide, dans du carton solide, pas de dommage apparent cette fois ci. Branchement, exécution:
pi@rpi3:~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
-> eureka, adresse 0x3C !!

Affichons quelque chose. Recherche internet: pas mal de pages sur SSD1306. J'essaye la librairie python Adafruit trouvée sur google.

Ah ... affichage ... Oh, pas lisible (Voir ici). Des frissons: quand même pas deux fois !

Petite recherche , en effet c'est ce qui arrive si on affiche avec un driver SSD1306 sur SH1106. De plus sur les commentaires amazon, des utilisateurs le mentionnent. C'est vrai que sur le paquet il est écrit: SH1106. Mea culpa. Ouf.

Ah, un peu moins de ressources, mais je tombe finalement sur la librairie Luma OLED (voir références).

EXCELLENT, ÇA MARCHE !

Autopsie

J'en profite donc pour faire une autopsie du premier écran. Le dispositif se présente sous la forme d'un circuit imprimé avec quelques CMS, une fiche I2C et un écran colle sur la circuit imprime par un double face et soude sur ce circuit par le biais d'un ruban de liaison. Le circuit ne sert donc vraiment qu'a fournir les quelques composants externes nécessaires (résistances, condensateur et un transistor) au composant SH1106 qui est intégré directement sur l'écran, a sa base.


mardi 16 octobre 2018

Installation HP LasetJet 3330 sur raspberry pi et partage avec Mac et Windows

J'utilisais jusque la une paire d'imprimantes Canon LBP2900 et LBP1120. Le driver de celles ci n'étant plus supporte sur Windows, j'utilisais un vieux PC Linux comme serveur d'impression. Seulement voila, l'imprimante et le PC se faisant vieux, l'imprimante ne donnait pas de très bon résultats d'impression, et le PC est tombe en panne. Il faut ajouter a cela que le driver CAPT spécifique Canon (ccpd) posait quelques fois problème, et que le PC était un peu gros. Jusqu'à présent, dans un local technique cela ne posait pas trop problème, sauf pour aller chercher l'impression.
Donc mon deuxième choix s'est porte sur une vieille (elle aussi) imprimante HP LaserJet 3330, mais en utilisant un Raspberry Pi (Raspbian) pour lui donner une interface réseau.
J'ai donc installe CUPS sur le RPI, puis branche l'imprimante (bon, avant cela j'ai du faire un petit nettoyage pour résoudre le problème du scanner qui ronflait, voir https://www.youtube.com/watch?v=lqG_nmi3vC4 ).
L'imprimante a été reconnue du premier coup dans l'interface web de CUPS.
Impression page de test: yes !
Partage sur Mac : woouah ! protocole "Bonjour", page test marche du premier coup !
Alors la bravo !

Reste Windows.... Hummm.... Super Windows avec CUPS...

La j'ai passe 2 heures.
Bon, j'ai essayé d'ajouter l'imprimante avec l'adresse http://addr.rpi.ici:631/printers/HP_LaserJet_3330
Après plusieurs essais (de divers drivers PS), je vois bien le fichier arriver dans le spool linux, mais il affiche une erreur. En fait le problème est que le fichier envoyé est encapsulé en PJL, et CUPS n'aime pas. Bon, quelques recherches sur internet plus tard, malgres le fait que le driver Linux de base fonctionne, j'installe "hplip", qui devrait egalement me permettre de scanner plus facilement en plus de l'impression, mais surtout, je declare une deuxième imprimante Marque "Raw", type "raw", de manière à ce que les données envoyées de Windows aillent directement a l'imprimante sans passer par les filtres CUPS.
Seulement voila, windows ne propose pas la bonne imprimante. Le site HP ne propose que le driver universel pour la 3330. Celle ci est compatible Postscript 2 et PCL 5e/6, et la dernière version du driver universel ne propose que PCL6e et Postscript Level 3. Bon, je choisis windows 8, et la on trouve le driver pour PCL5.
Je choisis cette fois ci un Driver: "HP Universal Printing PCL 5".
Et voila, impression super rapide sur windows...

vendredi 29 août 2014

numérotation des titres automatique sous Google Doc

Dans la version google doc 2014, il n'est pas possible de faire, simplement, une numérotation automatique des titres.
Oui, il est possible de créer la structure du document en premier, et d'utiliser les listes numérotées, mais si on écrit le document de façon séquentielle, c'est mort.

Voici un script Google App Script qui fait le travail. Il est basé sur des solutions que l'on trouve sur internet, et ajoute un peu  de configurabilité (des séparateurs notamment).

Dans un document google docs, ouvrir l'editeur de script (Tools->Script editor), puis copy/paste de ce code, puis selectionner la fonction à démarrer, puis l'executer, ceci ajoute un menu avec deux actions.


function onOpen() {  
  DocumentApp.getUi().createMenu('Laurent')  
    .addItem('add Heading Numbering', 'addHeaderNumbering')  
    .addItem('remove Heading Numbering', 'removeHeaderNumbering')  
    .addToUi();  
 }  
 // quote regular expression characters  
 RegExp.quote = function(str) {  
   return (str+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");  
 };  
 // inserted between numbers (customizable)  
 var numSeparator = '.'  
 // added between numbering and text (customizable)  
 var lastSeparator = '\t'  
 // heading concerned (prefix and levels)  
 var headTxt='Heading '  
 var headFirst=1  
 var headLast=6  
 // build regex  
 var reHeading = new RegExp("^"+headTxt+"(["+headFirst+"-"+headLast+"])$");  
 var reNumbering=new RegExp("^["+RegExp.quote(numSeparator)+"0-9]+"+RegExp.quote(lastSeparator))  
 function addHeaderNumbering () {  
  setHeaderNumbering(1)  
 }  
 function removeHeaderNumbering () {  
  setHeaderNumbering(0)  
 }  
 function setHeaderNumbering(addNumber) {  
  // empty array for numbering  
  var counterHeader = Array.apply(null, new Array(headLast-headFirst+1)).map(Number.prototype.valueOf,0);  
  // loop on all document paragraphs  
  var paragraphs = DocumentApp.getActiveDocument().getBody().getParagraphs();  
  for(var i=0; i < paragraphs.length; ++i) {  
   var currentPar = paragraphs[i];  
   var headStr = String(currentPar.getHeading())  
   var isHeading=headStr.match(reHeading)  
   // get headings  
   if (isHeading) {  
    var levelIndex=isHeading.pop()-headFirst;  
    // increment current level before using it  
    ++counterHeader[levelIndex];  
    var numbering = '';  
    // build numbering if necessary  
    if (addNumber){  
     for ( var j = 0; j < counterHeader.length; ++j) {  
      if (j <= levelIndex) {  
       numbering += counterHeader[j] + (j == levelIndex ? '' : numSeparator);  
      } else {  
       counterHeader[j] = 0;  
      }  
     }  
     numbering+=lastSeparator  
    }  
    currentPar.setText(numbering+currentPar.getText().split(reNumbering).pop());   
   }  
  }  
 }  

mardi 26 novembre 2013

Sauver les messages video skype sous mac os

Il arrive que l'on veuille sauver un message video sur skype.
Cette fonctionalite n'est pas disponible encore par defaut.

En faisant une petite recherche google, il est possible de trouver diverses methodes, qui requierent cependant quelques manipulations.

Voici un "one liner" permettant d'automatiser la procedure:


let x=0;for db in Library/Application\ Support/Skype/*/main.db;do sqlite3 "$db" 'select vod_path from VideoMessages;'|while read url;do curl -# "$url" > video$x.mov;let x=x+1;done;done