צריך עזרה בלהוסיף פקודה curl לrule OH

בית חכם, עוזרות חכמות, חשמל חכם, מערכות שליטה ובקרה, Amazon Echo, Alexa, Google home, Control4, RTI, מנעולים חכמים ועוד.
razserv2010 פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013
נתן תודות: 114 פעמים
קיבל תודות: 67 פעמים

שליחה #1 

יש לי את הפקודה הזאת:

קוד: בחירת הכל

curl -d '{"id":"test", "action":"activate"}' -H 'Content-Type: application/json' -X PUT http://192.168.0.111:8888/api/scenes
אין לי מושג איך להוסיף אותה לrule ואני אשמח לעזרה..

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

שליחה #2 

הי,
יש בגדול שתי אופציות שיצא לי להשתמש בהן.
הצורה הכי ישירה, להשתמש בפעולה executeCommandLine.
מוזמן לקרוא בתיעוד של OH:
https://www.openhab.org/docs/configurat ... ec-actions

דוגמא להרצת הפקודה:
dig +short myip.opendns.com @resolver1.opendns.com (פקודה שאמורה להחזיר לך את ה- IP החיצוני שלך)

קוד: בחירת הכל

rule "Check Public IP"
when
    Item Sys_CheckPublicIP received command ON
then
    logInfo(filename, "Checking Public IP")
    var String currentIP = executeCommandLine(Duration.ofSeconds(15),"dig","+short","myip.opendns.com","@resolver1.opendns.com")
    logInfo(filename, "IP is: " + currentIP)
    currentIP = currentIP.substring(0,currentIP.length-1)
    Sys_PublicIP.postUpdate(currentIP)
end
הפרמטר הראשון זה הזמן ל- timeout לפקודה. כלומר כמה זמן לחכות לתשובה.
מעבר לזה שים לב שכל פרמטר צריך להיות מופרד בפסיק בפקודה. כלומר- איפה שיש רווח בפקודה שלך אתה צריך לשים פסיק, וכמובן שבין הפסיקים הכל זה מחרוזת ולכן צריך להיות עטוף במרכאות.

האופציה השניה שלך, במידה ומשום מה זה לא עובד או שיש פקודה מסובכת מדי, זה להכניס את הפקודה (או סט הפקודות) ל- shell script (ויש לזה מלא מדריכים מאוד פשוטים באינטרנט) ואז באמצעות הפעולה executeCommandLine להריץ את ה- script הרלוונטי.
באופציה הזאת רק צריך להיזהר כי המערכת תריץ את ה- script עם המשתמש openhab ולא עם openhabian (איתו אתה נכנס ל- SSH, בהנחה שאתה עובד התקנת openhabian) ואז רק צריך לוודא שלמשתמש openhab יש הרשאות הרצה ל- script הרלוונטי במיקום הרלוונטי.

דוגמא לחוק שמריץ script כזה:

קוד: בחירת הכל

rule "VPN Server Control"
when
    Item Sys_VPNControl received command
then
    logInfo(filename, "Controling the VPN server: " + receivedCommand)
    switch Sys_VPNControl.state {
        case "Activate":{
            executeCommandLine("sudo","/usr/bin/vpn/startService.sh")
            Sys_VPNCheck.sendCommand(ON)
        }
        case "Deactivate": {
            executeCommandLine("sudo","/usr/bin/vpn/stopService.sh")
            Sys_VPNCheck.sendCommand(ON)
        }
        case "Check": {
            Sys_VPNCheck.sendCommand(ON)
        }
    }
end
מקווה שעונה.
אם בחרת באופצית ה- script והסתבכת עם ההרשאות עדכן ואנסה לעזור. מרגיש שהצלחתי לפצח את זה כשמימשתי את החוק לדוגמא שנתתי כאן...
בהצלחה.

razserv2010 פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013
נתן תודות: 114 פעמים
קיבל תודות: 67 פעמים

שליחה #3 

@chenta
שוב תודה על הסבר מפורט ממך,
הרצת הפקודה ישר מתוך rule אני לא מצליח להבין
אז הלכתי על הפיתרון הקל יותר והכנסתי את הפקודה לscript התקנתי git על המחשב והצלחתי להפעיל את הסקריפט

razserv2010 פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013
נתן תודות: 114 פעמים
קיבל תודות: 67 פעמים

שליחה #4 

@chentaאני מחפש דרך לקבל התראות באנדרואיד TV, ניסית להגדיר התראות באנדרואיד TV מopenhab? בקודי זה עובד יפה.

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

שליחה #5 

@razserv2010
בשמחה :)

כל דרך שעובדת היא לגיטימית. אם משהו שם לא מסדתר לך ותרצה בכל זאת סיוע בהרצת הפקודה ישירות דבר איתי.

לגבי Android TV- לא יצא לי לעבוד עם זה...
יש Binding ל OH?
איך אתה מדבר עם ה TV?

לא יודע אם עוזר או קשור אבל אני יודע שבטלפון אנדרואיד רגיל אפשר להתקין את Tasker שיש לו plugin ל OH ואז הוא יודע לראות את ה items ואולי גם יודע לקבל הודעות. לא יודע אם זה רלוונטי לטלוויזיה.

razserv2010 פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013
נתן תודות: 114 פעמים
קיבל תודות: 67 פעמים

שליחה #6 

@chenta
מצאתי את זה אבל אני לא יודע אם זה יעבוד עם windows 10
https://community.openhab.org/t/sending ... d-tv/39465

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

שליחה #7 

@razserv2010
מעניין. לא הכרתי את השפה הזאת.
מהמעט שראיתי נראה שיש אפשרות להתקין Go על Win10 מהאתר שלהם, וכן הוזכר בשרשור ששלחת שמישהו הצליח לממש את זה על Windows.
אז זה כנראה אמור לעבוד...

נקודה חשובה שאולי הייתי צריך להדגיש בתשובה הראשונית שלי-
בסופו של דבר אתה תצטרך להריץ פקודה כלשהיא עם executeCommandLine
בגרסאות קודמות של OH בפקודה שכוללת פרמטרים (כלומר ערכים שמופרדים בניהם ברווח) היה צריך להחליף כל רווח ב @@.
החל מגרסא כלשהיא (לא זוכר בדיוק איזו) זה כבר לא עובד ככה וצריך להפריד כל פרמטר בפסיק כמו שכתבתי בתשובה הראשונית.
תראה שאתה לא נופל על זה... 8)

razserv2010 פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013
נתן תודות: 114 פעמים
קיבל תודות: 67 פעמים

שליחה #8 

התקנתי GO אבל נראה שצריך להתקין גם nfa מה שלא הצלחתי להבין מה זה..

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

שליחה #9 

אם הבנתי נכון Go זאת שפת התכנות (או הסביבה או משהו כזה) וה nfa היא אפליקציה שכתובה ב Go שמאפשרת שליחת הודעות ל Android TV.

חכם_חנוכה
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 793
הצטרף: אפריל 2005
נתן תודות: 87 פעמים
קיבל תודות: 36 פעמים

שליחה #10 

אתה סתם מסתבך

בגרסא 3 אתה מוסיף binding ל http ולאחר מכן יוצר thing של ה api
https://www.openhab.org/addons/bindings/http/

razserv2010 פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013
נתן תודות: 114 פעמים
קיבל תודות: 67 פעמים

שליחה #11 

@חכם_חנוכה
הייתי עושה את זה אבל כרגע טוב לי עם OH2

@chenta
אני עדיין מנסה להבין איך להפעיל פקודה ישירה ולא דרך סקריפט, עשיתי שינויים בפקודה אבל עדיין לא עובד ואין שגיאות

קוד: בחירת הכל

executeCommandLine("curl@@-d@@-H@@Content-Type: application/json@@-X@@PUT@@{\"id\": \"clear\", \"action\": \"activate\"}@@http://192.168.0.111:8888/api/scenes")

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

שליחה #12 

@razserv2010
הי אנסה לעזור, כמה שאלות:
1. איזו גרסת OH אתה מריץ? האם התקנת ע"י openhabian?
2. שתף שוב את הפקודה עצמה.
3. תוכל להסביר לי רגע מה היא אמורה לעשות?

razserv2010 פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013
נתן תודות: 114 פעמים
קיבל תודות: 67 פעמים

שליחה #13 

@chenta
openhab 2.5.10 על ווינדוס 10
זאת הפקודה (היא עובדת אם אני מריץ אותה מה terminal מרספברי פיי)

קוד: בחירת הכל

curl -d '{"id":"clear", "action":"activate"}' -H 'Content-Type: application/json' -X PUT http://192.168.0.111:8888/api/scenes
הפקודה אמורה להפעיל סצנות שנשמרו תחת ID למשל בפקודה יש:

קוד: בחירת הכל

"id":"clear"
זה שם הסצנה ששמורה בledfx
זה הקישור לdocs של ledfx
https://ledfx.readthedocs.io/en/master/ ... api-scenes

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

שליחה #14 

05/05/2021 14:37  
razserv2010 כתב:
@chenta
openhab 2.5.10 על ווינדוס 10
זאת הפקודה (היא עובדת אם אני מריץ אותה מה terminal מרספברי פיי)

קוד: בחירת הכל

curl -d '{"id":"clear", "action":"activate"}' -H 'Content-Type: application/json' -X PUT http://192.168.0.111:8888/api/scenes
הפקודה אמורה להפעיל סצנות שנשמרו תחת ID למשל בפקודה יש:

קוד: בחירת הכל

"id":"clear"
זה שם הסצנה ששמורה בledfx
זה הקישור לdocs של ledfx
https://ledfx.readthedocs.io/en/master/ ... api-scenes
...
לא הבנתי משהו- אתה על ווינדוס 10 או על Raspberry Pi?
OH רצה על ה- Raspberry ואתה ניגש אליה ממחשב Win10?

אני אניח לרגע שזה המצב.
הפרמטר הראשון בפקודה צריך להיות timeout והערך צריך להיות מתאים לפקודה. יכול להיות שאם אתה לא מחכה לתשובה אז הערך יכול להיות מינימלי. נניח שניה אחת.
אחרי זה כל פרמטר בפקודה שלך צריך להיות עטוף ב- " " ולהיות מופרד בפסיק.
כמה נקודות שאני לא בטוח לגביהן וכדאי לעשות ניסוי כדי לראות אם יעבדו-
סימני המרכאות שנמצאים בפקודה עצמה שלך צריכים להיות מוחרגים (escaped) ולמיטב הבנתי צריכים להיות מוחלפים ב- "\
לגבי ביטויים שמוקפים בגרש בודד, יכול להיות שיכולים להישאר כמו שהם.
אופציה ראשונה-

קוד: בחירת הכל

executeCommandLine(Duration.ofSeconds(15),"curl","-d","'{\"id\":\"clear\", \"action\":\"activate\"}'","-H","'Content-Type: application/json'","-X","PUT","http://192.168.0.111:8888/api/scenes")
אופציה נוספת- הורדתי שני רווחים מהפקודה המקורית שאני לא בטוח שהכרחיים (למרות שאני לא ממש מכיר את מה שקורה שם אז אולי אני טועה:

קוד: בחירת הכל

executeCommandLine(Duration.ofSeconds(15),"curl","-d","'{\"id\":\"clear\",\"action\":\"activate\"}'","-H","'Content-Type:application/json'","-X","PUT","http://192.168.0.111:8888/api/scenes")
עדכן אם משהו מהם עבד...

razserv2010 פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013
נתן תודות: 114 פעמים
קיבל תודות: 67 פעמים

שליחה #15 

@chentaopenhab מותקן על ווינדוס 10, ledfx ועוד דברים אחרים מותקנים על הPI
סליחה שבילבלתי אותך
דרך אגב הפקודות לא תקינות, VSC מראה שגיאות בפקודה

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

שליחה #16 

@razserv2010
בקטנה... הבנתי...
אם ככה יכול להיות שיש פה בעיה כלשהיא.
הפקודות שרשמתי יגרמו ל- OH להריץ את הפקודה על המכונה שעליה היא מותקנת. כלומר על מחשב ה- Win10.
האם אתה מסוגל להריץ את הפקודה הזאת ב- CMD של מחשב ה- Win10?
אני מניח שלא כי curl למיטב היכרותי היא פקודה של linux.
ואם הפקודה הזאת מיועדת להרצה על ה- RPi, אז אין סיבה שהיא תעבוד כמו שהיא מתוך Win10.
האם הבנתי נכון את המצב?

אם כן יש שני רעיונות שעלו לי בשלב זה:
1. לראות האם יש פקודה שעושה את מה שאתה צריך שאפשר להריץ אותה ישירות ממחשב ה- Win10 בממשק CMD. אם כן, היא זו שצריכה להיכנס לתוך executeCommandLine
2. לנסות להבין איך להריץ מתוך windows סקריפט או פקודה שנמצאים ב- RPi. מחיפוש קצר עלה לי ה thread הבא:
https://community.openhab.org/t/windows ... -rpi/81622
לכאורה מישהו מנסה לעשות בדיוק את מה שאתה מנסה. עוד לא קראתי הכל כדי להבין האם ואיך נפתר.
כן נראה שיש דרך מתוך ה- CMD להריץ פקודת SSH ישירות ואולי בשיטה זו לגורם לסקריפט שתכין מראש ב- RPi שיכיל את הפקודה שאתה רוצה.

סתם כי סיקרנת אותי אני אמשיך לקרוא על זה. אעדכן אם יש אמצא משהו מועיל.
ותעדכן אם הצלחת ואיך...

razserv2010 פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013
נתן תודות: 114 פעמים
קיבל תודות: 67 פעמים

שליחה #17 

תודה אני אבדוק שם את התרד ונפל לי האסימון שאם curl מותקן בlinux אז הוא גם אמור להיות מותקן בwindows אז התקנתי אותו אבל אני לא מצליח להפעיל את הפקודה דרך cmd

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

שליחה #18 

הי יש לי פיתרון שאתה יכול לנסות.
הרעיון הוא דרך putty (בהנחה שמותקן) להריץ ב- RPi סקריפט שנמצא על מחשב ה- windows.
כנראה שאפשר לעשות עם תוכנות אחרות של SSH אבל זה מה שיש לי וגם מצאתי באינטרנט את הדוגמא.

נניח שעל מחשב ה- Win10 יש את הקובץ הבא:

קוד: בחירת הכל

#!/bin/bash
# This script should creat a direcory named test
mkdir /etc/openhab/test
השורה הראשונה חשובה (למיטב הבנתי), השורה השניה היא הערה- תחליף במה שאתה רוצה או תמחק, בשורה השלישית רשמתי סתם פקודה שתרוץ ושאני אוכל לוודא שהיא בוצעה. לצורך העניין במקום שורה זו תשים את פקודת ה- curl על שלל הפרמטרים כמו שהם (בלי כל השטויות של מרכאות ופסיקים שרשמתי קודם).
הקובץ צריך להיות שמור עם סיומת sh (שוב, למיטב הבנתי).

ואז הפקודה שאתה צריך להריץ ב- CMD על מחשב ה- Win היא:

קוד: בחירת הכל

putty.exe -ssh <user>@192.168.XXX.XXX -pw "password" -m "C:\Users\chenta\startservice.sh"
שים לב להחליף את <user> בשם המשתמש (בלי מרכאות) שאיתו אתה עושה login ל- Pi, לשים את ה- IP הנכון של ה- Pi ואת הסיסמא (להשאיר את המרכאות), וכמובן לשנות את ה- path הנכון לקובץ.

הניסוי הזה שביצעתי הצליח...
מקווה שעוזר.

razserv2010 פותח השרשור
חבר פעיל במיוחד
חבר פעיל במיוחד
תגובות: 806
הצטרף: אוקטובר 2013
נתן תודות: 114 פעמים
קיבל תודות: 67 פעמים

שליחה #19 

@chentaתודה
הצלחתי להפעיל את הפקודה בcmd, מסתבר ש windows לא מסתדר עם ' אחד וצריך לשים "
הנה הפקודה: אבל לא הצלחתי לממש את זה בopenhab

קוד: בחירת הכל

curl -d "{\"id\": \"clear\", \"action\": \"activate\"}"  -H 'Content-Type: application/json' -X PUT http://192.168.0.111:8888/api/scenes

chenta
חבר פעיל מאוד
חבר פעיל מאוד
תגובות: 183
הצטרף: ינואר 2011
נתן תודות: 22 פעמים
קיבל תודות: 29 פעמים

שליחה #20 

@razserv2010
תוכל להדביק את הפקודה המלאה ששמת?
ואת השגיאות שהתקבלו?

שלח תגובה

חזור אל “בית חכם ובקרה”